/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb.sessionBeans;

import java.util.ArrayList;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import modelo.Usuario;

/**
 *
 * @author inftel
 */
@Stateless
public class UsuarioFacade extends AbstractFacade<Usuario> implements UsuarioFacadeRemote {

    @PersistenceContext(unitName = "TelePaSOS-ejbPU")
    private EntityManager em;

    protected EntityManager getEntityManager() {
        return em;
    }

    public UsuarioFacade() {
        super(Usuario.class);
    }

    public Usuario findByPhone(String phone) {
        Usuario usuario;
        try{
        usuario = (Usuario) em.createQuery("SELECT u FROM Usuario u WHERE u.telefono LIKE :tlf")
                .setParameter("tlf", phone)
                .getSingleResult();
        }catch(NoResultException e){
            return null;
        }      
        
        
        return usuario;
    }

    public Usuario findByIdUsuario(Integer idUsuario) {
        Usuario usuario;

        try{
        usuario = (Usuario) em.createQuery("SELECT u FROM Usuario u WHERE u.idUsuario = ?1")
                .setParameter(1, idUsuario)
                .getSingleResult();
        }catch(NoResultException e){
            return null;
        }

        return usuario;
    }
    
    public List<Usuario> findByNombre(String nombre){
        List<Usuario> list;
        try{
        list =  em.createQuery("SELECT u FROM Usuario u WHERE u.nombre LIKE :nomb")
                .setParameter("nomb", "%"+nombre+"%")
                .setMaxResults(20)
                .getResultList();
        }catch(NoResultException e){
            return null;
        }
        return list;
    }
    
    public List<Usuario> findByApellidos(String apellidos){
        List<Usuario> list;
        try{
        list =  em.createQuery("SELECT u FROM Usuario u WHERE u.apellidos LIKE :apll")
                .setParameter("apll", "%"+apellidos+"%")
                .setMaxResults(20)
                .getResultList();
        }catch(NoResultException e){
            return null;
        }
        return list;
    }
    
    public List<Usuario> findUser(String nombre,String apellidos,String phone){
        Usuario user=null;
        List<Usuario> nombre_list=null;
        List<Usuario> apellidos_list=null;        
        List<Usuario> list = new ArrayList<Usuario>();
        
        if(!"".equalsIgnoreCase(phone))       user = findByPhone(phone);
        if(!"".equalsIgnoreCase(nombre))      nombre_list = findByNombre(nombre);
        if(!"".equalsIgnoreCase(apellidos))   apellidos_list = findByApellidos(apellidos);
        
        
        if(user!=null)
            list.add(user);
        
        if(nombre_list!=null && !nombre_list.isEmpty()){
            if(user==null)
                list.addAll(nombre_list);
            else{
                for(Usuario u:nombre_list){
                    if(!user.getTelefono().equalsIgnoreCase(phone))
                        list.add(u);
                }
            }            
        }
        
        if(apellidos_list!=null && !apellidos_list.isEmpty()){
            int i;
            if(list.isEmpty())
                list.addAll(apellidos_list);
            else{
                for(Usuario u:apellidos_list){
                    for(i=0;i<list.size() && list.get(i).getIdUsuario()!=u.getIdUsuario();i++);
                    if(i==list.size())
                        list.add(u);
                }
            }
        }
        
        return list;
    }
}
